package ar.republicagroup.gestion.util.helpers;
import static ch.lambdaj.Lambda.*;
import ar.republicagroup.gestion.entities.Cheque;
import ch.lambdaj.function.matcher.LambdaJMatcher;
import ch.lambdaj.group.Group;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.hamcrest.Matchers;

/**
 *
 * @author DIEGOALV
 */
public class FilterCheque {
     
    
    public static LambdaJMatcher<Cheque> filterChequesByCuenta(int cuentaBanco){
        return having(on(Cheque.class).getCuentaBancoId().getId().intValue(), Matchers.equalTo(cuentaBanco));
    }
    
    public static LambdaJMatcher<Cheque> filterChequesByOrigen(String origen){
        return having(on(Cheque.class).getOrigen(), Matchers.equalToIgnoringCase(origen));
    }
    
    public static LambdaJMatcher<Cheque> filterChequesByTipo(int tipoChequeId){
        return having(on(Cheque.class).getChequeTipoId().getId(),Matchers.equalTo(tipoChequeId));
    }
    
    public static LambdaJMatcher<Cheque> filterChequesByBanco(int bancoId){
        return  having(on(Cheque.class).getBancoId().getId(),Matchers.equalTo(bancoId));
    }
    
    public static LambdaJMatcher<Cheque> filterChequesByEstado(int chequeEstadoId){
        return having(on(Cheque.class).getChequeEstadoId().getId(),Matchers.equalTo(chequeEstadoId));
    }
    
    
    /**
     * Agrupa todos los bancos de una lista de cheques 
     * para identificar cuántos bancos distintos hay en un listado de cheques.
     * @param chequeList, el listado de cheques del cual queremos agrupar por bancos
     * @return List<String> bancoIdList, retorna los ID de todos los bancos que intervienen en el listado de cheques
     * @see 
     */
    public static List<String> getBancosIdByChequeList(List<Cheque> chequeList){
         /* Agrupamos todos los cheques de este cliente para obtener todos los bancos de estos cheques */                                            
        Group<Cheque> groupChequeByBanco    = group(chequeList,by(on(Cheque.class).getBancoId().getId()));
        Set<String> groupChequeByBancoKeys  = groupChequeByBanco.keySet();
        /*Convertimos el SET a LIST , lo ordenamos alfabéticamente y lo pasamos como param */
        List<String> bancoIdList = new ArrayList(groupChequeByBancoKeys);
        Collections.sort(bancoIdList);
        
        return bancoIdList;
    }
    
    public static List<String> getCuentaBancoIdByChequeList(List<Cheque> chequeList){
         /* Agrupamos todos los cheques de este cliente para obtener todos las cuentas bancarias de estos cheques */                                            
        Group<Cheque> groupChequeByCuenta    = group(chequeList,by(on(Cheque.class).getCuentaBancoId().getId()));
        Set<String> groupChequeByCuentaKeys  = groupChequeByCuenta.keySet();
        /*Convertimos el SET a LIST , lo ordenamos alfabéticamente y lo pasamos como param */
        List<String> cuentaBancoIdList = new ArrayList(groupChequeByCuentaKeys);
        Collections.sort(cuentaBancoIdList);
        
        return cuentaBancoIdList;
    }
    
        
}
